package com.can.volatileTest;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 不保证原子性
 * Atomic原子类 解决原子性问题
 */
public class VolatileDemo02 {

    //volatile不保证原子性
    //原子类的 Integer
    private volatile static AtomicInteger num = new AtomicInteger(0);

    public static void main(String[] args) { //main线程

        //理论上 num结果应该为20000
        for (int i = 1; i <= 20; i++) {
            new Thread(()->{
                for (int j = 1; j <= 1000; j++) {
                    add();
                }
            }).start();
        }
        //Thread.activeCount()当前存活的线程数
        while (Thread.activeCount()>2){ //main gc
            Thread.yield(); //yield将当前线程变为就绪状态
        }
        System.out.println(Thread.currentThread().getName()+" "+num);
    }


    public static void add(){
//        num++;  //不是一个原子性操作
        num.getAndIncrement(); //AtomicInteger +1方法 ,CAS,比synchronized高效多倍
    }
}